/*
*********************************************************************************************************
*
* 模块名称 :  xg050串口屏模块【原创】
* 文件名称 :  bsp_uartfifo_xg050.c
* 版    本 :  V1.0
* 说    明 :  V1.0版本用串口中断，第二版本V2.0版本用dma搬运方式
*           一帧数据最大有效数据长度为254BYTE，请勿超出
*
* 修改记录 :
*   版本号     日期      作者     说明
*   V1.0       2025-2-8  miaozi   正式发布
*
*
*
*********************************************************************************************************
*/

#include "bsp.h"

#define   XG050_CMDID_H         0x5A      //  帧头
#define   XG050_CMDID_L         0xA5      //  帧头
#define   XG050_CMD_WRITE_REG   0x80      //  写寄存器指令
#define   XG050_CMD_READ_REG    0x81      //  读寄存器指令
#define   XG050_CMD_WRITE_VAR   0x82      //  写变量存储空间指令
#define   XG050_CMD_READ_VAR    0x83      //  读变量存储空间指令
#define   XG050_CMD_WRITE_CURVE 0x84      //  写曲线缓冲区指令
#define   XG050_CMD_SIZE        4         //  命令部分的长度（最大）
#define   XG050_CMDDATA_SIZE    248       //  命令部分的长度（最大249）

//start:  系统寄存器，写到应用层：GUI
//#define   XG050_CMDADDR_BEEP
//#define   XG050_CMDADDR_LED
//end  :  系统寄存器
//start:  变量存储空间，写到应用层：GUI
//end  :  变量存储空间

#define   XG050_UART  &huart6
#define   BUF_SIZE    4096                    //  根据样本数量适当调整，以字节为单位
UART_T                    g_XG050;            //  串口FIFO操作句柄
static  uint8_t xg050_txbuf[BUF_SIZE];        //  XG050数据缓冲区
//static  uint8_t           rxbuf[BUF_SIZE];
static  CircularFifo_U8_T h_TxBuff;           //  发送环形缓冲区句柄
//static  CircularFifo_U8_T g_RxBuff;         //  接收环形缓冲区

static  uint8_t xg050_cmd[XG050_CMD_SIZE]={XG050_CMDID_H,XG050_CMDID_L,0,0};    //  XG050命令缓冲区


//  XG050驱动初始化
void  BSP_XG050_Init(void)
{
  h_TxBuff.data     = xg050_txbuf;
  h_TxBuff.buf_size = BUF_SIZE;
  g_XG050.pTxFifo   = &h_TxBuff;

  g_XG050.g_uart    = XG050_UART;
  g_XG050.FIFO_Init = FIFO_U8_Init;
  g_XG050.FIFO_IsEmpty  = FIFO_U8_IsEmpty;
  g_XG050.FIFO_IsFull   = FIFO_U8_IsFull;
  g_XG050.FIFO_Write    = FIFO_U8_Write;
  g_XG050.FIFO_Read     = FIFO_U8_Read;

  FIFO_U8_Init(&h_TxBuff);
  return;
}

//  XG050写寄存器数据
void  BSP_XG050_WriteReg(uint8_t CmdAddr,uint8_t *_ucaBuf, uint16_t _usLen)
{
  if(xg050_cmd[0]==XG050_CMDID_H  &&  xg050_cmd[1]==XG050_CMDID_L)  //  帧头校验
  {
    xg050_cmd[2]  = _usLen+2;                     //  全局变量：2:1字节寄存器指令 1字节寄存器地址
    xg050_cmd[3]  = XG050_CMD_WRITE_REG;          //  全局变量
  }
  else
    return;

  UartSend(&g_XG050,xg050_cmd,XG050_CMD_SIZE);    //  命令部分
  UartSend(&g_XG050,&CmdAddr,1);                  //  数据部分：命令地址
  UartSend(&g_XG050,_ucaBuf,_usLen);              //  数据部分
  return;
}

//  XG050写变量空间
void  BSP_XG050_WriteVar(uint8_t CmdAddr_H,uint8_t CmdAddr_L,uint8_t *_ucaBuf, uint16_t _usLen)
{
  if(xg050_cmd[0]==XG050_CMDID_H  &&  xg050_cmd[1]==XG050_CMDID_L)  //  帧头校验
  {
    xg050_cmd[2]  = _usLen+3;                     //  全局变量：3:1字节寄存器指令 2字节寄存器地址
    xg050_cmd[3]  = XG050_CMD_WRITE_VAR;          //  全局变量
  }
  else
    return;
  uint8_t cmd_addr[]={CmdAddr_H,CmdAddr_L};
  UartSend(&g_XG050,xg050_cmd,XG050_CMD_SIZE);    //  命令部分
  UartSend(&g_XG050,cmd_addr,2);                  //  数据部分：命令地址
  UartSend(&g_XG050,_ucaBuf,_usLen);              //  数据部分
  return;
}

//  XG050写曲线缓冲区
void  BSP_XG050_WriteCurve(uint8_t CmdAddr,uint8_t *_ucaBuf, uint16_t _usLen)
{
  if(xg050_cmd[0]==XG050_CMDID_H  &&  xg050_cmd[1]==XG050_CMDID_L)  //  帧头校验
  {
//    xg050_cmd[2]  = _usLen+2;                     //  全局变量：2:1字节寄存器指令 1字节寄存器地址
    xg050_cmd[3]  = XG050_CMD_WRITE_CURVE;        //  全局变量
  }
  else
    return;

  //  step1：超出最大帧长度
  while(_usLen  > XG050_CMDDATA_SIZE)                //  切片发送
  {
    xg050_cmd[2]  = XG050_CMDDATA_SIZE+2;
    _usLen  = _usLen  - XG050_CMDDATA_SIZE;

    UartSend(&g_XG050,xg050_cmd,XG050_CMD_SIZE);    //  命令部分
    UartSend(&g_XG050,&CmdAddr,1);                  //  数据部分：命令地址
    UartSend(&g_XG050,_ucaBuf,XG050_CMDDATA_SIZE);  //  数据部分
    _ucaBuf+=XG050_CMDDATA_SIZE;
  }
  //  step2：满足最大帧长度
  xg050_cmd[2]  = _usLen+2;
//  _ucaBuf+=XG050_CMDDATA_SIZE;
  UartSend(&g_XG050,xg050_cmd,XG050_CMD_SIZE);    //  命令部分
  UartSend(&g_XG050,&CmdAddr,1);                  //  数据部分：命令地址
  UartSend(&g_XG050,_ucaBuf,_usLen);              //  数据部分
  return;
}


///*    搬移至stm32xxxxic.c
//*********************************************************************************************************
//*	函 数 名: HAL_UART_TxCpltCallback
//*	功能说明: 串口发送回调
//*	形    参:
//*	返 回 值:
//*********************************************************************************************************
//*/
//void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
//{
//  // HAL 在触发 HAL_UART_TxCpltCallback 之前，已经处理了 TC 标志 和中断使能位
//#if defined(HAL_UART_MODULE_ENABLED) || defined(HAL_USART_MODULE_ENABLED)
//  UART_T *_pUart;
//
//#if defined(_BSP_UARTFIFO_XG050_H_)
//  if (huart->Instance == USART6)                //  在这里处理发送完成后的操作
//  {
//    _pUart=&g_XG050;
//
//    if (_pUart->FIFO_IsEmpty(_pUart->pTxFifo))  //  如果没有数据需要发送，可以禁用 TXE 中断
//    {
//      //  __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
//      //  __HAL_UART_DISABLE_IT(huart, UART_IT_TC);
//    }
//    else 	// 如果还有数据需要发送
//    {
//      uint8_t senddata;
//      _pUart->FIFO_Read(_pUart->pTxFifo,&senddata); //  继续发送下一个字节
//      HAL_UART_Transmit_IT(huart, &senddata, 1);     //  继续通过中断发送
//    }
//  }
//#endif
//
//#endif
//}

//**************************** LinkJoin(END OF FILE) ********************************
